BigQuery で Cloud Storage データの自動検出を試してみた(Preview) #cm_google_cloud_adcal_2024
こんにちは!エノカワです。
この記事はクラスメソッドの Google Cloud アドベントカレンダー2024 の 15日目の記事です。
BigQuery で Cloud Storage データを自動検出する機能が プレビュー になりました。
この機能により、BigQuery で Cloud Storage バケット内のデータをスキャンし、メタデータを抽出してカタログ化することができます。
Dataplex automatic discovery lets you scan data in Cloud Storage buckets to extract and catalog metadata. Automatic discovery creates BigLake or external tables and object tables you can use for analytics and AI, and catalogs that data in Dataplex Catalog. This feature is available in public preview.
今回は、この新機能を実際に試してみましたので、その内容をご紹介します。
Dataplex の自動検出機能とは?
Dataplex の自動検出機能は、Google Cloud 内の分散データを効率的に管理し、統合的に分析やガバナンスを行うためのツールです。
具体的には以下のことが可能です。
- Cloud Storage や BigQuery のデータを自動検出:データ構造を解析し、メタデータを生成
- メタデータの統合管理:Dataplex Catalog に登録し、組織全体での共有と再利用を促進
- BigLake テーブルや外部テーブルの自動作成:生成されたテーブルを BigQuery や他の分析ツールで即座に活用可能
今回ご紹介する BigQuery で Cloud Storage データを自動検出する機能は、この Dataplex の自動検出機能の一部として提供されています。
この機能を使うことで、BigQuery に直接 Cloud Storage データを取り込み、スキーマ情報を自動的に設定し、スムーズに分析作業を開始できます。
前提
Cloud Storage データの自動検出を利用するには、以下の設定が必要です。
公式ドキュメントを参照して環境を準備してください。
- Dataplex API を有効化
- 外部接続の作成
- BigQuery から Cloud Storage にアクセスするために、外部データ接続を設定します。
- 作成した BigQuery 接続サービス アカウントに Storage オブジェクト閲覧者(
roles/storage.objectViewer
) ロールを付与します。 - 公式ガイドを参考に作成してください。
- Dataplex のサービスアカウントに必要な IAM ロール を付与
- データソース プロジェクトに対する BigQuery ユーザー(
roles/bigquery.user
) - データソース バケットに対するストレージ オブジェクト閲覧者(
roles/storage.objectViewer
) - BigQuery 接続管理者(
roles/bigquery.connectionAdmin
)
- データソース プロジェクトに対する BigQuery ユーザー(
準備
今回は、以下のような構造化データ(CSVファイル)と非構造化データ(画像ファイル)を用意しました。
- 構造化データ(CSVファイル)
- users1.csv
- users2.csv
- users3.csv
- 非構造化データ(画像ファイル)
- image1.jpg
- image2.png
これらを Cloud Storage バケットにアップロードして検証を行います。
以下は、今回使用したファイル構成です。
gs://cm_enokawa_work/
├── structured/
│ ├── users1.csv
│ ├── users2.csv
│ └── users3.csv
└── unstructured/
├── image1.jpg
└── image2.png
検出スキャンを作成する
BigQuery コンソールから、Cloud Storage データを自動検出するスキャンを作成します。
[エクスプローラ] で、[+ 追加] をクリックします。
[追加] ペインの [一般的なソース] セクションで、[Cloud Storage から外部テーブルと BigLake テーブルを自動作成] をクリックします。
[テーブルを作成] ペインの [ソース] セクションで、スキャンするデータの詳細を構成します。
今回は、以下の構成としました。
- ID:
gcs-scan
- バケット:
cm_enokawa_work
- スキャンするファイルを含む Cloud Storage バケットを指定します。
- 接続ID:
asia-northeast1.dataplex-connection-gcs
- Google Cloud リソース接続 ID を指定します。
- 検出の頻度:
オンデマンド
- 検出スキャンを実行する頻度を指定します。
データ検出スキャンの構成が完了したら、[RUN NOW] をクリックします。
オンデマンド スキャンは、作成時に最初に 1 回実行されます。
[ログを確認] をクリックして、検出スキャン結果を確認してみましょう。
検出スキャン結果を確認する
検出スキャンの結果を確認するには、スキャンの実行時に作成されたログをクエリします。
ログを確認する
ログエクスプローラで、ログクエリに次のフィルタを追加してログをフィルタリングします。
resource.type="dataplex.googleapis.com/DataScan"
resource.labels.datascan_id="gcs-scan"
2024-12-14 18:11:12.592 {"@type":"type.googleapis.com/google.cloud.dataplex.v1.DataScanEvent", "createTime":"2024-12-14T09:11:12.585284073Z", "dataSource":"//storage.googleapis.com/projects/{PROJECT_NUMBER}/buckets/cm_enokawa_work", "jobId":"54774419-7cb2-4062-8775-b02c50a8f325", "scope":"FULL", "state":"CREATED", "trigger":"ON_DEMAND", "type":"DATA_DISCOVERY"}
2024-12-14 18:11:23.546 {"@type":"type.googleapis.com/google.cloud.dataplex.v1.DataScanEvent", "createTime":"2024-12-14T09:11:12.585284073Z", "dataSource":"//storage.googleapis.com/projects/{PROJECT_NUMBER}/buckets/cm_enokawa_work", "jobId":"54774419-7cb2-4062-8775-b02c50a8f325", "scope":"FULL", "startTime":"2024-12-14T09:11:23.533753537Z", "state":"STARTED", "trigger":"ON_DEMAND", "type":"DATA_DISCOVERY"}
2024-12-14 18:17:10.657 BigQuery BigLake table structured has been published
2024-12-14 18:17:10.657 BigQuery object table unstructured has been published
2024-12-14 18:17:10.827 Discovered data statistics: {tables: 1, filesets: 1}
2024-12-14 18:17:10.906 {"@type":"type.googleapis.com/google.cloud.dataplex.v1.DataScanEvent", "createTime":"2024-12-14T09:11:12.585284073Z", "dataSource":"//storage.googleapis.com/projects/{PROJECT_NUMBER}/buckets/cm_enokawa_work", "endTime":"2024-12-14T09:17:10.897127176Z", "jobId":"54774419-7cb2-4062-8775-b02c50a8f325", "scope":"FULL", "startTime":"2024-12-14T09:11:23.533753537Z", "state":"SUCCEEDED", "trigger":"ON_DEMAND", "type":"DATA_DISCOVERY"}
ログにはスキャンの進行状況や生成されたテーブルに関する詳細が記録されています。
たとえば、ジョブの作成時刻 (createTime
)、スキャン対象のデータソース (dataSource
)、ジョブの状態 (state
) などが含まれます。
また、テーブルが正しく生成されたことを確認するために、BigLake table と object table が公開されたことを示すメッセージも記録されています。
テーブルを確認する
検出スキャンを実行すると、スキャン対象の GCS バケット名と同じ名前のデータセット (cm_enokawa_work
) が BigQuery 内に作成されます。
このデータセットには、フォルダ名に対応した構造化データ用のテーブル (structured
) と非構造化データ用のテーブル (unstructured
) が自動的に生成されます。
構造化データのテーブル
構造化データのテーブルの詳細です。
ソース URI が gs://cm_enokawa_work/structured/*.csv
の BigLake テーブルとして作成されていることが分かります。
構造化データのテーブルのスキーマです。
CSV ファイルの列名やデータ型が自動的に抽出されていることが確認できます。
SELECT *, _FILE_NAME FROM `enokawa-hayato.cm_enokawa_work.structured` ORDER BY user_id;
上記のクエリを実行すると、CSVファイル内のデータとファイルパスが確認できます。
この情報により、どの GCS ファイルからデータが読み取られたのかを追跡可能です。
| user_id | name | age | city | _FILE_NAME |
| ------- | ------- | --- | --------- | ------------------------------------------ |
| 1 | Alice | 25 | Tokyo | gs://cm_enokawa_work/structured/users1.csv |
| 2 | Bob | 30 | Osaka | gs://cm_enokawa_work/structured/users1.csv |
| 3 | Charlie | 35 | Nagoya | gs://cm_enokawa_work/structured/users1.csv |
| 4 | David | 40 | Fukuoka | gs://cm_enokawa_work/structured/users2.csv |
| 5 | Eve | 28 | Sapporo | gs://cm_enokawa_work/structured/users2.csv |
| 6 | Frank | 33 | Kobe | gs://cm_enokawa_work/structured/users2.csv |
| 7 | Grace | 29 | Hiroshima | gs://cm_enokawa_work/structured/users3.csv |
| 8 | Hank | 31 | Sendai | gs://cm_enokawa_work/structured/users3.csv |
| 9 | Ivy | 27 | Yokohama | gs://cm_enokawa_work/structured/users3.csv |
非構造化データのテーブル
非構造化データのテーブルの詳細です。
ソース URI が gs://cm_enokawa_work/unstructured/*
の オブジェクトテーブルとして作成されていることが分かります。
非構造化データのテーブルのスキーマです。
URI、ファイルタイプ、サイズ、MD5 ハッシュ値など、メタデータの詳細が自動的に抽出されていることが分かります。
SELECT * FROM `enokawa-hayato.cm_enokawa_work.unstructured`;
上記のクエリを実行すると、画像ファイルのメタデータが確認できます。
| uri | generation | content_type | size | md5_hash | updated | metadata |
| -------------------------------------------- | ---------------- | ------------ | ---- | -------------------------------- | ------------------------------ | ---------------------- |
| gs://cm_enokawa_work/unstructured/image1.jpg | 1734165007734342 | image/jpeg | 9570 | 8eb34dbb895ed7210069254157fd98a0 | 2024-12-14 08:30:07.736000 UTC | "{ ""metadata"": []}" |
| gs://cm_enokawa_work/unstructured/image2.png | 1734165007726560 | image/png | 8502 | cfd1b8cc391d21490227504244d82579 | 2024-12-14 08:30:07.729000 UTC | "{ ""metadata"": []}" |
まとめ
以上、BigQuery で Cloud Storage データを自動検出する機能を使ってみました。
この機能を利用することで、BigQuery コンソールから簡単に Cloud Storage データをスキャンできるようになり、手作業でのテーブル設定やスキーマ定義にかかる時間と労力を大幅に削減できます。
特にデータレイクの構築やリアルタイム分析が必要なプロジェクトで効果を発揮するのではないでしょうか。
さらに、この機能ではスキャンの頻度を柔軟に設定できるため、オンデマンド実行だけでなく、繰り返し実行を選択することで定期的なデータ更新にも対応可能です。
また、スキャンの作成時には、構造化データ(CSV、JSON)の仕様を細かく設定することもできます。
仕様があらかじめ分かっている場合は、下記のようなオプションを設定しておくことで、スキャン精度をさらに高めることができます。
明日 12/16 は 村田一紘 さんです。よろしくお願いします!